/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EEmpleado;
import LogicaNegocio.Empleados.Bibliotecario;
import LogicaNegocio.Empleados.Empleado;
import LogicaNegocio.Empleados.JefeBibliotecario;
import LogicaNegocio.Encriptacion.Encriptar;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Empleado en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerEmpleado.java
 * @version 1.0
 * Fecha: mar may  4 14:00:33 COT 2010
 */


public class ManagerEmpleado {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Empleado
     * recibe como argumento el nombre de la unidad de persistencia.
     *
     * @param unidadPersistencia
     */
    public ManagerEmpleado() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Metodo encargado de la persistencia en la entidad Empleado
     * de un objeto Empleado
     *
     * @param empleado
     */
    public void crearEmpleado(Empleado empleado) throws RollbackException, EntityExistsException {
        entityManager.clear();
        EEmpleado entidadEmpleado = new EEmpleado();
        entidadEmpleado.setCedulaempleado(empleado.getCedula());
        entidadEmpleado.setCedulaempleadojefe(empleado.getCedulaEmpleadoJefe());
        entidadEmpleado.setPrimerapellido(empleado.getPrimerApellido());
        entidadEmpleado.setPrimernombre(empleado.getPrimerNombre());
        entidadEmpleado.setSegundoapellido(empleado.getSegundoApellido());
        entidadEmpleado.setSegundonombre(empleado.getSegundoNombre());
        entidadEmpleado.setPassword(new Encriptar(empleado.getPassword()).obtenerEncriptado());
        entidadEmpleado.setDireccion(empleado.getDireccion());
        entidadEmpleado.setTelefono(empleado.getTelefono());
        entidadEmpleado.setUniversidad(empleado.getUniversidad());
        entidadEmpleado.setCargo(empleado.getCargo());
        entidadEmpleado.setVinculado(empleado.getVinculado());
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entityManager.persist(entidadEmpleado);
        transaccion.commit();
        entityManager.clear();
    }

    /**
     * Este metodo desvincula un empleado de la bibioteca.
     * 
     * @param cedulaEmpleado
     */
    public void desvincularEmpleado(int cedulaEmpleado) {
        entityManager.clear();
        EEmpleado entidadEmpleado;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEmpleado = entityManager.find(EEmpleado.class, cedulaEmpleado);
        transaccion.commit();
        if(entidadEmpleado != null){
            entidadEmpleado.setVinculado(false);
            transaccion.begin();
            entityManager.merge(entidadEmpleado);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Metodo que actualiza un empleado de la base de datos.
     *
     * @param cedulaEmpleado
     * @param empleado
     */
    public void actualizarEmpleado(int cedulaEmpleado, Empleado empleado) {
        entityManager.clear();
        EEmpleado entidadEmpleado;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEmpleado = entityManager.find(EEmpleado.class, cedulaEmpleado);
        transaccion.commit();
        if(entidadEmpleado != null){
            entidadEmpleado.setCedulaempleado(empleado.getCedula());
            if(empleado.getCargo().equals("Bibliotecario")){
                entidadEmpleado.setCedulaempleadojefe(empleado.getCedulaEmpleadoJefe());
            }
            entidadEmpleado.setPrimerapellido(empleado.getPrimerApellido());
            entidadEmpleado.setPrimernombre(empleado.getPrimerNombre());
            entidadEmpleado.setSegundoapellido(empleado.getSegundoApellido());
            entidadEmpleado.setSegundonombre(empleado.getSegundoNombre());
            entidadEmpleado.setPassword(new Encriptar(empleado.getPassword()).obtenerEncriptado());
            entidadEmpleado.setDireccion(empleado.getDireccion());
            entidadEmpleado.setTelefono(empleado.getTelefono());
            entidadEmpleado.setUniversidad(empleado.getUniversidad());
            entidadEmpleado.setCargo(empleado.getCargo());
            entidadEmpleado.setVinculado(empleado.getVinculado());
            transaccion.begin();
            entityManager.merge(entidadEmpleado);
            transaccion.commit();
            Query consulta = entityManager.createQuery("UPDATE EPrestamo e SET e.cedulaempleado = :cedulaempleadonuevo WHERE e.cedulaempleado = :cedulaempleadoanterior");
            consulta.setParameter("cedulaempleadonuevo", entidadEmpleado.getCedulaempleado());
            consulta.setParameter("cedulaempleadoanterior", cedulaEmpleado);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
            consulta = entityManager.createQuery("UPDATE EPedido e SET e.cedulaempleado = :cedulaempleadonuevo WHERE e.cedulaempleado = :cedulaempleadoanterior");
            consulta.setParameter("cedulaempleadonuevo", entidadEmpleado.getCedulaempleado());
            consulta.setParameter("cedulaempleadoanterior", cedulaEmpleado);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Obtiene el empleado bibliotecario que este registrado con el
     * numero de cedula indicado.
     * Si no existe el bibliotecario lanza un excepcion.
     *
     * @param cedulaEmpleado
     * @return bibliotecario
     * @throws Exception
     */
    public Bibliotecario obtenerBibliotecario(int cedulaEmpleado) throws Exception {
        entityManager.clear();
        EEmpleado entidadEmpleado;
        Bibliotecario bibliotecario = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEmpleado = entityManager.find(EEmpleado.class, cedulaEmpleado);
        transaccion.commit();
        if(entidadEmpleado != null && entidadEmpleado.getCargo().equals("Bibliotecario")){
            bibliotecario = new Bibliotecario();
            bibliotecario.setCedula(entidadEmpleado.getCedulaempleado());
            bibliotecario.setCedulaEmpleadoJefe(entidadEmpleado.getCedulaempleadojefe());
            bibliotecario.setPrimerApellido(entidadEmpleado.getPrimerapellido());
            bibliotecario.setPrimerNombre(entidadEmpleado.getPrimernombre());
            bibliotecario.setSegundoApellido(entidadEmpleado.getSegundoapellido());
            bibliotecario.setSegundoNombre(entidadEmpleado.getSegundonombre());
            bibliotecario.setPassword(entidadEmpleado.getPassword());
            bibliotecario.setDireccion(entidadEmpleado.getDireccion());
            bibliotecario.setTelefono(entidadEmpleado.getTelefono());
            bibliotecario.setUniversidad(entidadEmpleado.getUniversidad());
            bibliotecario.setCargo(entidadEmpleado.getCargo());
            bibliotecario.setVinculado(entidadEmpleado.getVinculado());
        }else{
            throw new Exception("El Bibliotecario con cedula : "+cedulaEmpleado+" no esta registrado en el sistema");
        }
        entityManager.clear();
        return bibliotecario;
    }

    /**
     * Obtiene el jefe bibliotecario identificado con cedula empleado.
     * retorna null si no existe.
     *
     * @param cedulaEmpleado
     * @return jefeBibliotecario
     */
    public JefeBibliotecario obtenerJefeBibliotecario(int cedulaEmpleado) throws Exception {
        entityManager.clear();
        EEmpleado entidadEmpleado;
        JefeBibliotecario jefeBibliotecario = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEmpleado = entityManager.find(EEmpleado.class, cedulaEmpleado);
        transaccion.commit();
        if(entidadEmpleado != null && entidadEmpleado.getCargo().equals("JefeBibliotecario")){
            jefeBibliotecario = new JefeBibliotecario();
            jefeBibliotecario.setCedula(entidadEmpleado.getCedulaempleado());
            jefeBibliotecario.setPrimerApellido(entidadEmpleado.getPrimerapellido());
            jefeBibliotecario.setPrimerNombre(entidadEmpleado.getPrimernombre());
            jefeBibliotecario.setSegundoApellido(entidadEmpleado.getSegundoapellido());
            jefeBibliotecario.setSegundoNombre(entidadEmpleado.getSegundonombre());
            jefeBibliotecario.setPassword(entidadEmpleado.getPassword());
            jefeBibliotecario.setDireccion(entidadEmpleado.getDireccion());
            jefeBibliotecario.setTelefono(entidadEmpleado.getTelefono());
            jefeBibliotecario.setUniversidad(entidadEmpleado.getUniversidad());
            jefeBibliotecario.setCargo(entidadEmpleado.getCargo());
            jefeBibliotecario.setVinculado(entidadEmpleado.getVinculado());
        }else{
            throw new Exception("El Jefe Bibliotecario con cedula : "+cedulaEmpleado+" no esta registrado en el sistema");
        }
        entityManager.clear();
        return jefeBibliotecario;
    }

    public Bibliotecario ingresarSistemaBibliotecario(int numeroCedula, String password) throws Exception {
        Bibliotecario bibliotecario;
        bibliotecario = obtenerBibliotecario(numeroCedula);
        String pass = new Encriptar(password).obtenerEncriptado();
        System.out.println("Bibliotecario Password: "+bibliotecario.getPassword()+" = "+pass);
        if(bibliotecario.getVinculado() && bibliotecario.getPassword().equals(new Encriptar(password).obtenerEncriptado())){
            return bibliotecario;
        }else{
            throw new Exception("El Bibliotecario con numero de cedula "+numeroCedula+" que intenta ingresar al sistema no esta vinculado actualmente");
        }
    }

    public JefeBibliotecario ingresarSistemaJefe(int numeroCedula, String password) throws Exception {
        JefeBibliotecario jefe;
        jefe = obtenerJefeBibliotecario(numeroCedula);
        String pass = new Encriptar(password).obtenerEncriptado();
        System.out.println("Jefe Password: "+jefe.getPassword()+" = "+pass);
        if(jefe.getVinculado() && jefe.getPassword().equals(new Encriptar(password).obtenerEncriptado())){
            return jefe;
        }else{
            throw new Exception("El Jefe Bibliotecario con numero de cedula "+numeroCedula+" que intenta ingresar al sistema no esta vinculado actualmente");
        }
    }

}
